package com.bigdata;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bigdata.utils.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * @className: BootStrap
 * @description: TODO 生成用户访问行为数据 包含：启动日志，事件日志
 */
public class BootStrap {
    // 日志数据量：
    int startupNum = 100000;
    //
    int eventNum = 200000;
    //
    Date startTime = null;
    //
    Date endTime = null;

    RandomDate_java randomDateJava = null;
    public BootStrap() { }

    // 生成访问与访问之间的随机时长：
    public BootStrap(String startTimeString, String endTimeString, int startupNum, int eventNum) {
        try {
            startTime = new SimpleDateFormat("yyyy-MM-dd").parse(startTimeString);
            endTime = new SimpleDateFormat("yyyy-MM-dd").parse(endTimeString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        randomDateJava = new RandomDate_java(startTime, endTime, startupNum + eventNum);
    }

    //1. 设备编号：
    String appId = "uzest";
    //2. 手机系统：
    RanOpt[] osOpts = {new RanOpt("ios", 3), new RanOpt("andriod", 7)};
    RandomOptionGroup<String> osOptionGroup = new RandomOptionGroup(osOpts);
    //3. 用户所在区域：
    RanOpt[] areaOpts = {
            new RanOpt("朔州", 10),
            new RanOpt("大同", 10),
            new RanOpt("太原", 20),
            new RanOpt("临汾", 5),
            new RanOpt("朔州", 5),
            new RanOpt("吕梁", 5),
            new RanOpt("太原", 5),
            new RanOpt("太原", 5),
            new RanOpt("太原", 5),
            new RanOpt("运城", 5)
    };
    RandomOptionGroup<String> areaOptionGroup = new RandomOptionGroup(areaOpts);
    //4. 版本号
    RanOpt[] vsOpts = {
            new RanOpt("1.2.0", 50),
            new RanOpt("1.1.2", 15),
            new RanOpt("1.1.3", 30),
            new RanOpt("1.1.1", 5)
    };
    RandomOptionGroup<String> vsOptionGroup = new RandomOptionGroup(vsOpts);
    //5. 事件类型
    RanOpt[] eventOpts = {
            new RanOpt("addFavor", 10),    //收藏
            new RanOpt("addComment", 30),  //评论
            new RanOpt("addCart", 20),     //购物车
            new RanOpt("clickItem", 40)    //点击
    };
    RandomOptionGroup<String> eventOptionGroup = new RandomOptionGroup(eventOpts);
    //6. 渠道类型
    RanOpt[] channelOpts = {
            new RanOpt("小米", 10),
            new RanOpt("华为", 20),
            new RanOpt("OPPO", 30),
            new RanOpt("360", 20),
            new RanOpt("百度", 10),
            new RanOpt("website", 10)
    };
    RandomOptionGroup<String> channelOptionGroup = new RandomOptionGroup(channelOpts);
    // 标记：判断日志的类型
    RanOpt[] quitOpts = {
            new RanOpt(true, 20),
            new RanOpt(false, 80)
    };
    RandomOptionGroup<Boolean> isQuitGroup = new RandomOptionGroup(quitOpts);

    /**
     * 初始化启动日志
     * @return
     * `type` string   COMMENT '日志类型',
     * `mid` string COMMENT '设备唯一标识',
     * `uid` string COMMENT '用户标识',
     * `os` string COMMENT '操作系统', ,
     * `appId` string COMMENT '应用id', ,
     * `vs` string COMMENT '版本号',
     * `ts` bigint COMMENT '启动时间', ,
     * `area` string COMMENT '城市'
     */
    public String initStartupLog() {
        // 设备id : 1 - 500
        String mid = "mid_" + RandomNum_Java.getRandInt(1, 500);
        // 用户id : 1 - 500
        String uid = "" + RandomNum_Java.getRandInt(1, 500);
        // 操作系统 ： ios ， andriod
        String os = osOptionGroup.getRandomOpt().getValue();
        // 设备id ： uzest
        String appid = this.appId;
        // 用户所在城市
        String area = areaOptionGroup.getRandomOpt().getValue();
        // 版本号
        String vs = vsOptionGroup.getRandomOpt().getValue();
        //
        //long ts= logDateUtil.getRandomDate().getTime();
        // 渠道类型
        String ch = os.equals("ios") ? "appstore" : channelOptionGroup.getRandomOpt().getValue();

        //封装JSON字符串：
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type", "startup");
        jsonObject.put("mid", mid);
        jsonObject.put("uid", uid);
        jsonObject.put("os", os);
        jsonObject.put("appid", appid);
        jsonObject.put("area", area);
        jsonObject.put("ch", ch);
        jsonObject.put("vs", vs);
        return jsonObject.toJSONString();
    }

    /**
     * 根据启动日志，初始化事件日志
     * @param startLogJson
     * @return
     * `type` string COMMENT '日志类型',
     * `mid` string COMMENT '设备唯一 表示',
     * `uid` string COMMENT '用户标识',
     * `os` string COMMENT '操作系统',
     * `appid` string COMMENT '应用id',
     * `area` string COMMENT '地区' ,
     * `evid` string COMMENT '事件id',
     * `pgid` string COMMENT '当前页',
     * `npgid` string COMMENT '跳转页',
     * `itemid` string COMMENT '商品编号',
     * `ts` bigint COMMENT '时间',
     */
    public String initEventLog(String startLogJson) {
        JSONObject startLog = JSON.parseObject(startLogJson);
        String mid = startLog.getString("mid");
        String uid = startLog.getString("uid");
        String os = startLog.getString("os");
        String appid = this.appId;
        String area = startLog.getString("area");
        String evid = eventOptionGroup.getRandomOpt().getValue();
        // 1 - 50
        int pgid = new Random().nextInt(50) + 1;
        // 1 - 50
        int npgid = new Random().nextInt(50) + 1;
        // 1 - 50
        int itemid = new Random().nextInt(50);
        //  long ts= logDateUtil.getRandomDate().getTime();

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type", "event");
        jsonObject.put("mid", mid);
        jsonObject.put("uid", uid);
        jsonObject.put("os", os);
        jsonObject.put("appid", appid);
        jsonObject.put("area", area);
        jsonObject.put("evid", evid);
        jsonObject.put("pgid", pgid);
        jsonObject.put("npgid", npgid);
        jsonObject.put("itemid", itemid);
        return jsonObject.toJSONString();
    }

    /**
     * 生成模拟数据：
     */
    public static void generateLog() {

        BootStrap jsonMocker = new BootStrap();
        //1. 指定数据量：
        jsonMocker.startupNum = 1000000000;
        for (int i = 0; i < jsonMocker.startupNum; i++) {
            //2. 生成启动日志：
            String startupLog = jsonMocker.initStartupLog();
            //3. 发送启动日志：
            RequestProcess.sendLogByAsynchronousRequest(startupLog);
            //4. 注意：每次循环，都会随机生成一个标记，从而判断是否要循环：
            while (!jsonMocker.isQuitGroup.getRandomOpt().getValue()) {
                //5. 生成事件日志：
                String eventLog = jsonMocker.initEventLog(startupLog);
                //6. 发送事件日志：
                RequestProcess.sendLogByAsynchronousRequest(eventLog);
            }
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        generateLog();
    }
}
